#梯度下降代码实现
import matplotlib.pyplot as plt

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = 1.0# Initial guess of weight 初始的权重猜测

#画图准备
cost_list = []
epoch_list = []

def forward(x):
    return x*w

def cost(xs,ys):#计算MSE
    cost = 0
    for x,y in zip(xs,ys):
        y_pred = forward(x)
        cost += (y_pred - y) ** 2
    cost_list.append(cost)
    return cost / len(xs)

def gradient(xs,ys):
    grad = 0
    for x,y in zip(xs,ys):
        grad += 2*x*(x * w - y)

    return grad/len(xs)

print("Predict (before traning）",4,forward(4))

for epoch in range(100):#100个epoch
    epoch_list.append(epoch)
    cost_val = cost(x_data,y_data)
    grad_val = gradient(x_data,y_data)
    w -= 0.01 * grad_val#默认学习率为0.01
    print("Epoch:",epoch,"w=",w,"loss=",cost_val)

print("Predict (after traning）",4,forward(4))

#Drwa the graph
plt.plot(epoch_list,cost_list)
plt.ylabel('Cost')
plt.xlabel('Epoch')
plt.show()